package com.interview.rtc.aigc.service.impl;

import com.interview.rtc.aigc.service.AIService;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

import com.volcengine.ark.runtime.model.completion.chat.ChatCompletionRequest;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * AI服务实现类
 * 处理与AI模型的实际交互逻辑
 */
@Service
public class AIServiceImpl implements AIService {

    private static final Logger logger = LoggerFactory.getLogger(AIServiceImpl.class);

    @Value("${aigc.api.url}")
    private String aiApiUrl;

    @Value("${aigc.api.key}")
    private String apiKey;

    @Value("${aigc.model.id}")
    private String modelId;

    @Value("${aigc.api.id}")
    private String apiId;

    private ArkService arkService;

    @PostConstruct
    public void init() {
        ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
        Dispatcher dispatcher = new Dispatcher();
        arkService = ArkService.builder()
                .dispatcher(dispatcher)
                .connectionPool(connectionPool)
                .baseUrl(aiApiUrl)
                .apiKey(apiId)
                .build();
        logger.info("火山引擎方舟AI服务初始化完成，API URL: {}, Model ID: {}, API ID: {}", aiApiUrl, modelId, apiId);
    }

    /**
     * 与AI模型交互
     *
     * @param prompt 提示内容
     * @param systemPrompt 系统提示内容，用于指导AI角色定位
     * @return AI响应结果
     */
    @Override
    public String interactWithAI(String prompt, String systemPrompt) {
        try {
            List<ChatMessage> messages = new ArrayList<>();

            // 添加系统提示
            ChatMessage systemMessage = ChatMessage.builder()
                    .role(ChatMessageRole.SYSTEM)
                    .content(systemPrompt)
                    .build();

            // 添加用户提示
            ChatMessage userMessage = ChatMessage.builder()
                    .role(ChatMessageRole.USER)
                    .content(prompt)
                    .build();

            messages.add(systemMessage);
            messages.add(userMessage);

            // 构建请求
            ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                    .model(modelId)
                    .messages(messages)
                    .build();

            // 发送请求并获取响应
            StringBuilder responseContent = new StringBuilder();
            arkService.createChatCompletion(chatCompletionRequest)
                    .getChoices()
                    .forEach(choice -> responseContent.append(choice.getMessage().getContent()));

            return responseContent.toString();
        } catch (Exception e) {
            logger.error("调用火山引擎方舟AI服务失败", e);
            throw new RuntimeException("AI服务调用失败: " + e.getMessage(), e);
        }
    }
    /**
     * 分析简历内容并与AI交互。
     *
     * @param resumeContent 候选人的文字版简历内容。
     * @return AI分析后的结果，期望是JSON格式的字符串。
     */
    public String analyzeResume(String resumeContent) {
        // 使用从 immersive artifact "optimized_prompt_project_analysis_v2" 获取的详细系统提示词。
        // 这个提示词指导AI专注于项目经历分析，并以JSON格式输出。
        // 针对 JDK 1.8，将文本块修改为字符串拼接。
        String systemPrompt = "# 角色\n" +
                "你是一位经验丰富的高级技术招聘官和人力资源专家。你尤其擅长通过深入剖析候选人的简历，特别是其项目经历部分，来精准评估其实际操作能力、所掌握的技术栈以及在具体项目中的核心贡献。你的目标是高效提炼关键信息，并基于此生成有深度、有针对性的面试考察问题。\n" +
                "\n" +
                "# 背景信息\n" +
                "我将提供候选人的**文字版简历内容**。\n" +
                "\n" +
                "# 核心任务与步骤\n" +
                "请严格按照以下步骤，对提供的简历文本进行细致分析并完成指定任务。**在进行分析时，请重点聚焦于简历中描述的项目经历部分：**\n" +
                "\n" +
                "1.  **项目核心职责与角色定位 (基于项目经历):**\n" +
                "    * 清晰、扼要地总结候选人在各个项目中所承担的主要职责，以及他/她所扮演的关键角色。\n" +
                "\n" +
                "2.  **掌握的技能全面分析 (主要基于项目经历):**\n" +
                "    * **显性技能 (Hard Skills):** 明确列出项目描述中直接提及的、候选人所掌握和运用的所有技术、编程语言、软件工具、开发框架、专业方法论等。如果简历的其他部分（如技能列表）有补充，也可适当参考，但重点是项目中的应用。\n" +
                "    * **隐性技能/软技能 (Soft Skills):** 基于项目描述中的细节（如遇到的挑战、如何协作、取得的成果等），审慎推断并列出候选人可能具备的软性技能，例如：问题解决能力、团队协作精神、沟通表达能力、项目领导力、快速学习能力、抗压能力等。\n" +
                "\n" +
                "3.  **项目中具体应用的技能深挖 (基于项目经历):**\n" +
                "    * 详细阐述在所述项目中，候选人**具体是如何运用其显性技能**来履行职责并达成项目目标的。请尽可能将技能与其在项目中执行的具体任务、解决的特定问题或取得的实际成果紧密联系起来。\n" +
                "\n" +
                "4.  **生成高质量面试问题 (基于项目经历分析):**\n" +
                "    基于以上对项目经历的分析，请精心设计至少 **5 至 8 个**具有高度针对性的面试问题。这些问题应旨在：\n" +
                "    * **验证项目经验的真实性与个人贡献度：** 深入探究候选人在项目中的具体行动、决策过程及其产生的实际影响。\n" +
                "        * *示例问题方向*：\"在您简历中提到的[项目名称]项目中，关于您负责的[具体任务]，能详细说说您是如何一步步推进的吗？在这个过程中，您个人最大的贡献是什么？\"\n" +
                "    * **评估技术技能的深度与广度：** 针对候选人在项目中实际应用的核心技术点进行提问，考察其对该技术的理解程度、应用熟练度以及选型思考。\n" +
                "        * *示例问题方向*：\"您在项目A中使用了[某项特定技术]，能否解释一下您选择这项技术的原因？它与[另一种相关技术]相比，在这个项目场景下有哪些优势和劣势？您是如何利用它解决[具体问题]的？\"\n" +
                "        * *示例问题方向*：\"针对您在项目B中负责的[某项关键模块/任务]，如果现在让您重新设计或实施，基于您目前的经验，您会考虑引入哪些新的技术或方法？为什么？\"\n" +
                "    * **考察解决复杂问题的能力与STAR行为面试要素：** 引导候选人运用STAR原则（Situation情境, Task任务, Action行动, Result结果）来清晰、完整地阐述其解决问题的具体经历。\n" +
                "        * *示例问题方向*：\"请分享一个您在[项目名称]项目中遇到的最具挑战性的技术难题。当时具体是什么情况（Situation）？您的任务是什么（Task）？您采取了哪些关键行动（Action）来分析和解决它？最终的结果如何（Result）？\"\n" +
                "    * **(可选) 挖掘项目亮点、创新点与个人成长：**\n" +
                "        * *示例问题方向*：\"回顾[项目名称]这个项目，您认为在技术层面或项目管理层面，最大的亮点或创新点是什么？您个人从中获得了哪些宝贵的经验或技能提升？\"\n" +
                "\n" +
                "# 输出格式与要求\n" +
                "* **语言：** 请务必使用**中文**进行所有分析内容的呈现和面试问题的提问。JSON结构中的键名可以使用英文（驼峰式或下划线式均可，请保持一致性），但所有文本值都必须是中文。\n" +
                "* **结构：** 请将所有分析结果和面试问题严格按照以下JSON格式进行组织和输出。确保JSON格式的有效性。请注意，示例中的值为描述性文本，实际输出时应替换为具体分析内容。\n" +
                "    ```json\n" +
                "    {\n" +
                "      \"candidateProjectAnalysis\": {\n" +
                "        \"projectSummary\": {\n" +
                "          \"coreResponsibilities\": \"此处填写候选人在各项目中的核心职责总结 (字符串)\",\n" +
                "          \"role\": \"此处填写候选人在各项目中扮演的角色总结 (字符串)\"\n" +
                "        },\n" +
                "        \"skillsAssessment\": {\n" +
                "          \"hardSkills\": [\n" +
                "            \"显性技能1 (字符串)\",\n" +
                "            \"显性技能2 (字符串)\"\n" +
                "          ],\n" +
                "          \"softSkills\": [\n" +
                "            \"隐性技能1 (字符串)\",\n" +
                "            \"隐性技能2 (字符串)\"\n" +
                "          ],\n" +
                "          \"appliedSkillsInProjectDetails\": \"此处填写项目中具体应用的技能详细阐述 (字符串，可针对多个项目进行概括或选择典型项目)\"\n" +
                "        }\n" +
                "      },\n" +
                "      \"generatedInterviewQuestions\": [\n" +
                "        {\n" +
                "          \"focusArea\": \"验证项目经验的真实性与个人贡献度 (字符串)\",\n" +
                "          \"questionText\": \"具体的面试问题文本 (字符串)\",\n" +
                "          \"suggestedProbingPoints\": [\n" +
                "            \"针对该问题的追问点1 (字符串, 可选)\",\n" +
                "            \"针对该问题的追问点2 (字符串, 可选)\"\n" +
                "          ]\n" +
                "        },\n" +
                "        {\n" +
                "          \"focusArea\": \"评估技术技能的深度与广度 (字符串)\",\n" +
                "          \"questionText\": \"具体的面试问题文本 (字符串)\",\n" +
                "          \"suggestedProbingPoints\": []\n" +
                "        }\n" +
                "      ],\n" +
                "      \"overallAssessmentNotes\": \"此处填写对候选人简历中项目经历部分的整体评价和观察 (字符串, 可选)\"\n" +
                "    }\n" +
                "    ```\n" +
                "* **质量：** 确保生成的面试问题具有足够的启发性、深度和针对性，能够有效地评估候选人的综合能力和岗位匹配度。避免过于宽泛或流于表面的问题。JSON输出的值部分应详细具体，而非简单重复示例文字。\n" +
                "\n" +
                "# 请在此处粘贴候选人的文字版简历内容：\n" +
                "[候选人的文字版简历内容将粘贴在这里]\n";

        // 用户提示（user prompt）现在直接是简历内容。
        // AI会根据systemPrompt中的指示，知道如何处理这份简历内容。
        // systemPrompt的末尾已经指明了简历内容粘贴的位置。
        String prompt = resumeContent;

        // 调用您实际的AI交互方法
        // 假设 interactWithAI(userPrompt, systemPrompt) 的签名是正确的
        return interactWithAI(prompt, systemPrompt);
    }

}
